package com.spzx.product.controller;

import com.spzx.common.core.domain.R;
import com.spzx.common.core.web.controller.BaseController;
import com.spzx.common.core.web.domain.AjaxResult;
import com.spzx.common.core.web.page.TableDataInfo;
import com.spzx.common.log.annotation.Log;
import com.spzx.common.log.enums.BusinessType;
import com.spzx.common.security.annotation.InnerAuth;
import com.spzx.common.security.annotation.Logical;
import com.spzx.common.security.annotation.RequiresPermissions;
import com.spzx.common.security.utils.SecurityUtils;
import com.spzx.product.api.domain.Brand;
import com.spzx.product.service.IBrandService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "品牌控制器类")
@RestController
@RequestMapping("/brand")
//@Slf4j
public class BrandController extends BaseController { //BaseController作用：封装响应统一结果。

    @Autowired
    IBrandService brandService ;

    /**
     * 控制器方法：主要作用
     *  1.接收请求参数
     *  2.调用业务层，获取数据结果
     *  3.异步：响应结果(JSON)或 同步：页面跳转(转发或重定向)
     */
    //Swagger接口声明,是客户端调用。
    @Operation(summary = "品牌列表分页查询")
    @GetMapping("/list")
    @RequiresPermissions(value = {"product:brand:list","product:brand:query"},logical = Logical.OR)
    // post 请求，查询条件存放在请求体中，需要@RequestBody来获取（json）转换为bean对象。
    // get 请求。不用@RequestBody注解，SpringMVC框架会自动将请求参数值封装在bean对象中。
    // 请求参数名称，与bean对象的属性名称一致。并提供get/set方法。会调用set方法封装数据。
    public TableDataInfo list(Brand brand){  //url?pageNum=1&pageSize=10&name=小米
        startPage(); //获取请求参数：pageNum,pageSize,封装Page对象(extends ArrayList)，用ThreadLocal绑定到当前线程上。DAO层查询SQL就会自动增加limit ?,?
        //PageHelper.startPage(pageNum,pageSize);
        List<Brand> list = brandService.selectBrandList(brand); //分页插件查询结果其实返回Page对象。
        return getDataTable(list);
    }

    @RequiresPermissions("product:brand:query")
    @Operation(summary = "根据id查询品牌详细信息")
    @GetMapping("/{id}")
    public AjaxResult get(@PathVariable Long id){
        return AjaxResult.success(brandService.selectBrandById(id)); // AjaxResult extends HashMap
    }

    @Log(title = "品牌管理", businessType = BusinessType.INSERT)
    @RequiresPermissions("product:brand:add")
    @Operation(summary = "保存")
    @PostMapping
    public AjaxResult add(@RequestBody @Validated Brand brand){ //注意：@RequestBody导包别导错。否则，一堆null属性
        brand.setCreateBy(SecurityUtils.getUsername()); //获取当前登录用户名称
        return toAjax(brandService.insertBrand(brand));
    }

    @Log(title = "品牌管理", businessType = BusinessType.UPDATE)
    @RequiresPermissions("product:brand:edit")
    @Operation(summary = "修改")
    @PutMapping
    public AjaxResult edit(@RequestBody @Validated Brand brand){ //注意：@RequestBody导包别导错。否则，一堆null属性
        brand.setUpdateBy(SecurityUtils.getUsername()); //获取当前登录用户名称
        return toAjax(brandService.updateBrand(brand));
    }

    @Log(title = "品牌管理", businessType = BusinessType.DELETE)
    @RequiresPermissions("product:brand:remove")
    @Operation(summary = "根据ids批量删除")
    @DeleteMapping("/{ids}") //   ids=1,2,3
    public AjaxResult delete(@PathVariable Long[] ids){
        return toAjax(brandService.deleteBatchBrand(ids));
    }


    @RequiresPermissions("product:brand:query")
    @Operation(summary = "所有品牌查询")
    @GetMapping("getBrandAll")
    public AjaxResult getBrandAll(){

        List<Brand> list = brandService.getBrandAll();
        return success(list);
    }



    //===========================================================

    @InnerAuth
    @Operation(summary = "获取全部品牌")
    @GetMapping("getBrandAllList")
    public R<List<Brand>> getBrandAllList() {
        return R.ok(brandService.getBrandAll());
    }

}
